package com.bsdsma.visonManagementSystemapp.service;

import com.bsdsma.visonManagementSystemapp.dto.BaogaoAddDto;
import com.bsdsma.visonManagementSystemapp.dto.BaogaoDto;
import com.bsdsma.visonManagementSystemapp.dto.PageRetDto;
import com.bsdsma.visonManagementSystemapp.dto.BaogaoSearchDto;
import com.bsdsma.visonManagementSystemapp.dto.BaogaoWithUserDto;
import com.bsdsma.visonManagementSystemapp.dto.ListAllRetDto;
import com.bsdsma.visonManagementSystemapp.dto.DataGroupByDateDto;
import com.bsdsma.visonManagementSystemapp.entity.Baogao;

import java.util.Date;
import java.util.List;

/**
* 视力报告业务操作接口声明
*/
public interface BaogaoService {

    /**
    * 分页查询视力报告
    *
    * @param dto   查询视力报告条件
    * @return      分页数据
    */
    PageRetDto<BaogaoWithUserDto> search(BaogaoSearchDto dto);

    /**
    * 查询所有视力报告
    */
    List<Baogao> listAll();

    /**
    * 查询所有视力报告以及是否只查询了自己的数据标识
    */
    ListAllRetDto<Baogao> listAllWithRet();

    /**
    * 查询所有视力报告
    */
    List<BaogaoDto> getAll(Integer year);

    /**
    * 查询所有视力报告
    */
    List<BaogaoDto> getByXuehao(Long xuehao);

    /**
    * 查询所有视力报告
    */
    List<BaogaoDto> getBySchool(String school, Integer year);

    /**
    * 添加视力报告
    * @param dto   添加的对象数据
    * @return      添加后的视力报告对象
    */
    BaogaoDto add(BaogaoAddDto dto);

    /**
    * 修改视力报告
    * @param id    主键ID
    * @param dto   修改数据
    * @return      修改后的视力报告对象
    */
    BaogaoDto update(Long id, BaogaoAddDto dto);

    /**
    * 通过ID查询
    * @param id    主键
    * @return      查询到的视力报告对象
    */
    Baogao getById(Long id);

    /**
    * 删除视力报告
    * @param id    视力报告ID
    */
    void delete(Long id);

    /**
    * 更新视力报告
    * @param id    视力报告ID
    */
    int updateById(Baogao entity);

    /**
    * 查询视力报告数量
    */
    Long count();

    /**
    * 按日期分组查询新增数量
    * @param beginDate 开始时间
    * @param endDate   结束时间
    * @return
    */
    List<DataGroupByDateDto> countByDay(Date beginDate, Date endDate);

    /**
    * 获取当前年度的视力报告
    * @param xuehao 学生学号
    * @return 当前年度的视力报告或null
    */
    BaogaoDto getCurrentYearReport(Long xuehao);

    /**
    * 检查学生是否有给定年份的视力报告
    * @param xuehao 学生学号
    * @param year 要检查的年份
    * @return 如果报告存在则返回true
    */
    boolean existsByXuehaoAndYear(Long xuehao, Integer year);
}
